package cn.sanch.pet.service.impl;

import cn.sanch.basic.loginContext.LoginContext;
import cn.sanch.basic.service.IBaiduAiAuditService;
import cn.sanch.basic.util.*;
import cn.sanch.order.domain.OrderPetAcquisition;
import cn.sanch.order.mapper.OrderPetAcquisitionMapper;
import cn.sanch.org.domain.Employee;
import cn.sanch.org.domain.Shop;
import cn.sanch.org.mapper.EmployeeMapper;
import cn.sanch.org.mapper.ShopMapper;
import cn.sanch.pet.domain.Pet;
import cn.sanch.pet.domain.SearchMasterMsg;
import cn.sanch.pet.domain.SearchMasterMsgAuditLog;
import cn.sanch.pet.dto.MsgDto;
import cn.sanch.pet.mapper.PetMapper;
import cn.sanch.pet.mapper.SearchMasterMsgAuditLogMapper;
import cn.sanch.pet.mapper.SearchMasterMsgMapper;
import cn.sanch.pet.query.SearchMasterMsgQuery;
import cn.sanch.pet.service.ISearchMasterMsgService;
import cn.sanch.basic.service.impl.BaseServiceImpl;
import cn.sanch.user.domain.Logininfo;
import cn.sanch.user.domain.User;
import cn.sanch.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 业务实现类：
 */
@Service
public class SearchMasterMsgServiceImpl extends BaseServiceImpl<SearchMasterMsg> implements ISearchMasterMsgService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private SearchMasterMsgMapper searchMasterMsgMapper;

    @Autowired
    private IBaiduAiAuditService baiduAiAuditService;

    @Autowired
    private SearchMasterMsgAuditLogMapper searchMasterMsgAuditLogMapper;

    @Autowired
    private ShopMapper shopMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private OrderPetAcquisitionMapper orderPetAcquisitionMapper;

    @Autowired
    private PetMapper petMapper;

    /**
     * 先添加，假如审核不通过，只是状态改了，记录还在，可以后期继续在原有信息上修改提交审核，
     * 以前都是审核通过再添加，如果审核不通过，就要重修填写所有信息
     * @param searchMasterMsg
     */
    @Override
    public void publish(SearchMasterMsg searchMasterMsg, HttpServletRequest request) {

        // 1.添加发布寻主消息

        // 获取登录信息对象
        Logininfo logininfo = LoginContext.getLogininfo(request);
        // 通过logininfoId获取用户登录user对象
        User user = userMapper.loadByLogininfoId(logininfo.getId());
        // 设置寻主消息对象的发布人id【登录用户】
        searchMasterMsg.setUserId(user.getId());
        // 添加发布信息对象
        searchMasterMsgMapper.save(searchMasterMsg);


        // 2.百度AI智能审核文本消息和图片

        // 审核文本，标题、宠物名、地址、毛色 - 调用IBaiduAiAuditService
        Boolean textBoo = baiduAiAuditService.textAudit(
                        searchMasterMsg.getTitle()
                        + "," + searchMasterMsg.getName()
                        + "," + searchMasterMsg.getAddress()
                        + "," + searchMasterMsg.getCoatColor()

        );
        // 审核图片
        Boolean imgBoo = baiduAiAuditService.imageAudit(searchMasterMsg.getResources());

        if (textBoo && imgBoo) {
            // 2.1.审核通过：修改信息状态为1【审核通过待处理状态】+
            // 根据百度地图将信息推送给最近的店铺 + 发送短信通知店铺 + 添加审核日志

            // 修改发布信息对象的状态和node
            searchMasterMsg.setState(1);
            searchMasterMsg.setNote("审核通过！");

            // 调用工具类获取发布信息的地址定位
            Point point = DistanceUtil.getPoint(searchMasterMsg.getAddress());

            // 调用工具类获取50公里内的店铺                            查询所有店铺，然后筛选50公里内的满足店铺
            Shop nearestShop = DistanceUtil.getNearestShop(point, shopMapper.findAll());
            // 如果50公里内有店铺
            if (nearestShop != null) {
                // 设置店铺id给发布寻主信息对象
                searchMasterMsg.setShopId(nearestShop.getId());
                System.out.println("店铺：" + nearestShop.getName() + "，您附近有新的寻主订单，请尽快处理！");
            }
            // 修改发布寻主信息对象 - 用的是智能审核，不用添加审核人
            searchMasterMsgMapper.update(searchMasterMsg);

            // 创建一个发布信息审核日志对象
            SearchMasterMsgAuditLog log = new SearchMasterMsgAuditLog();
            log.setMsgId(searchMasterMsg.getId());
            log.setState(1);
            log.setNote("审核通过！");
            searchMasterMsgAuditLogMapper.save(log);

        }else {
            // 2.2.审核不通过：修改信息状态为0【待审核状态】 + 添加审核日志

            // 修改发布信息对象的状态和node
            searchMasterMsg.setState(0);
            searchMasterMsg.setNote("审核不通过，文本或图片违规！");
            // 修改
            searchMasterMsgMapper.update(searchMasterMsg);

            // 创建一个发布信息审核日志对象
            SearchMasterMsgAuditLog log = new SearchMasterMsgAuditLog();
            log.setMsgId(searchMasterMsg.getId());
            //驳回
            log.setState(0);
            log.setNote("审核不通过，文本或图片违规！");
            searchMasterMsgAuditLogMapper.save(log);

            // 抛异常信息
            throw new BusinessException("审核不通过，文本或图片违规！");
        }
    }

    /**
     * 门户页面【前台页面】用户查看自己发布的寻主消息
     * @param query
     * @param request
     * @return
     */
    @Override
    public PageList<SearchMasterMsg> user(SearchMasterMsgQuery query, HttpServletRequest request) {
        // 调用工具类获取登录对象
        Logininfo logininfo = LoginContext.getLogininfo(request);
        // 通过logininfo的id获取user对象
        User user = userMapper.loadByLogininfoId(logininfo.getId());
        // 设置userId
        query.setUserId(user.getId());

        // 调用父类的分页查询方法
        return super.queryPage(query);
    }

    /**
     * 后台页面查看待处理的寻主信息 - state=1
     *
     * 店铺管理员：只能看到直接店铺待处理的寻主信息 - state=1 ， 有具体shopId，就是本店铺的id
     *
     * 平台管理员 - 能看到所有的待处理寻主信息 - state=1
     *  shopId is not null因为要看到所有的待处理，所有shopId不为null但是又不知道具体shopId
     *
     * @param query
     * @param request
     * @return
     */
    @Override
    public PageList<SearchMasterMsg> toHandle(SearchMasterMsgQuery query, HttpServletRequest request) {
        // 设置state=1
        query.setState(1);
        // 查询登录对象
        Logininfo logininfo = LoginContext.getLogininfo(request);
        // 通过登录信息对象的id查询员工对象
        Employee employee = employeeMapper.loadByLogininfoId(logininfo.getId());
        // 如果员工的店铺id不为空，则表示就是店铺管理员
        if (employee.getShop_id() != null) {
            // 设置shopId
            query.setShopId(employee.getShop_id());
        }

        return super.queryPage(query);
    }

    /**
     * 拒绝订单
     * @param msgId
     */
    @Override
    public void reject(Long msgId) {
        searchMasterMsgMapper.reject(msgId);
    }

    /**
     * 接单
     * @param msgDto
     */
    @Override
    public void accept(MsgDto msgDto) {

        // 1.获取参数

        // 员工对象id
        Long empId = msgDto.getHandler();
        // 寻主信息对象id
        Long msgId = msgDto.getMsgId();
        // 备注
        String note = msgDto.getNote();

        // 1.1.校验是否已经处理了

        // 通过寻主信息id查找订单对象
        OrderPetAcquisition orderTem = orderPetAcquisitionMapper.loadByMsgId(msgId);
        // 对象不为null，表示已经存在该订单了，不能再继续接单
        if (orderTem != null) {
            throw new BusinessException("该订单已被接单！");
        }

        // 2.创建宠物对象

        // 通过寻主信息对象id查找寻主信息对象
        SearchMasterMsg searchMasterMsg = searchMasterMsgMapper.findOne(msgId);
        // 将寻主信息对象的参数同步给宠物对象
        Pet pet = searchMasterMsg2Pet(searchMasterMsg);

        petMapper.save(pet);


        // 3.创建订单编号对象 - 传入宠物对象、寻主信息对象、员工对象

        OrderPetAcquisition oeder = buildOrderPetAcquisition(pet, searchMasterMsg, empId);
        orderPetAcquisitionMapper.save(oeder);


        // 4.给店铺发送短信
        System.out.println("您有新的订单已接收，请在规定时间内完成收购！");
    }

    /**
     * 创建订单编号对象 - 传入宠物对象、寻主信息对象、员工id
     * @param pet
     * @param searchMasterMsg
     * @param empId
     * @return
     */
    private OrderPetAcquisition buildOrderPetAcquisition(Pet pet, SearchMasterMsg searchMasterMsg, Long empId) {
        // 创建一个订单编号对象
        OrderPetAcquisition order = new OrderPetAcquisition();

        // 订单的编号 - 调用工具类生成
        String orderSn = CodeGenerateUtils.generateOrderSn(pet.getUserId());
        order.setOrderSn(orderSn);

        // 设置订单处理的时间期限 - 当前系统时间 + 2天
        Long lastcomfirmtime = System.currentTimeMillis() + 2*24*60*60*1000;
        order.setLastcomfirmtime(new Date(lastcomfirmtime));
        // 订单摘要
        order.setDigest(searchMasterMsg.getTitle());
        // 订单状态 - 待处理
        order.setState(0);
        // 多少钱
        order.setPrice(searchMasterMsg.getPrice());
        // 订单宠物id
        order.setPetId(pet.getId());
        // 订单：是谁发布的寻主信息
        order.setUserId(searchMasterMsg.getUserId());
        // 订单：分配的哪一个店铺
        order.setShopId(searchMasterMsg.getShopId());
        // 收购宠物的地址
        order.setAddress(searchMasterMsg.getAddress());
        // 店员id - 店铺的哪一个店员去上门处理
        order.setEmpId(empId);
        // 哪一条寻主消息
        order.setSearchMasterMsgId(searchMasterMsg.getId());

        return order;

    }

    /**
     * 通过寻主信息对象id查找寻主信息对象
     * @param searchMasterMsg
     * @return
     */
    private Pet searchMasterMsg2Pet(SearchMasterMsg searchMasterMsg) {
        // 创建一个宠物对象
        Pet pet = new Pet();

        // 宠物名
        pet.setName(searchMasterMsg.getName());
        // 宠物进价
        pet.setCostprice(searchMasterMsg.getPrice());
        // 宠物类型id
        pet.setTypeId(searchMasterMsg.getPetType());
        // 宠物寻主信息对象id
        pet.setSearchMasterMsgId(searchMasterMsg.getId());
        // 宠物图片
        pet.setResources(searchMasterMsg.getResources());
        // 宠物所属店铺id
        pet.setShopId(searchMasterMsg.getShopId());
        // 发布人用户id
        pet.setUserId(searchMasterMsg.getUserId());

        return pet;
    }
}
